package gestorbienraizok.usuarios;

import gestorBD.Controlador;
import java.util.Collections;
import uiMain.MenuDeOpciones;

public abstract class Persona implements Imprimible, Comparable<Persona> {

    long cedula;
    String contrasenha;
    String nombre;
    byte nivelDeAcceso;
    MenuDeOpciones menu;

    public Persona() {

    }

    public Persona(long cedula, String contrasenha, String nombre, byte nivelDeAcceso) {
        this.cedula = cedula;
        this.contrasenha = contrasenha;
        this.nombre = arreglarNombre(nombre);
        this.nivelDeAcceso = nivelDeAcceso;
        this.menu = new MenuDeOpciones(nivelDeAcceso);
    }

    public long getCedula() {
        return this.cedula;
    }

    public String getContrasenha() {
        return this.contrasenha;
    }

    public String getNombre() {
        return this.nombre;
    }

    public byte getNivelDeAcceso() {
        return this.nivelDeAcceso;
    }

    public MenuDeOpciones getMenu() {
        return this.menu;
    }

    public void setCedula(long cedula) {
        this.cedula = cedula;
    }

    public void setContrasenha(String contrasenha) {
        this.contrasenha = contrasenha;
    }

    public void setNombre(String nombre) {
        this.nombre = arreglarNombre(nombre);
    }

    public void setNivelDeAcceso(byte nivelDeAcceso) {
        this.nivelDeAcceso = nivelDeAcceso;
    }

    public void setMenu(MenuDeOpciones menu) {
        this.menu = menu;
    }

    public static Persona buscarPersona(long cedula) {

        for (int i = 0; i < Controlador.getListaDePersonas().size(); i++) {
            Persona estaPersona = Controlador.getListaDePersonas().get(i);
            if (estaPersona.getCedula() == cedula) {
                return estaPersona;
            }
        }
        return null;
    }

    public static String getResumenCedulaNombreYTipoDeTodos(int[] contador) {
        Collections.sort(Controlador.getListaDePersonas());

        String desc = new String();

        for (int i = 0; i < Controlador.getListaDePersonas().size(); i++) {
            Persona estaPersona = Controlador.getListaDePersonas().get(i);
            desc += String.format("%-5d", (contador[0] + i + 1));
            desc += String.format("%-13d", estaPersona.cedula);
            desc += String.format("%-26s", estaPersona.nombre);
            String tipoDePersonaMay = estaPersona.tipoDePersona().substring(0, 1).toUpperCase().concat(estaPersona.tipoDePersona().substring(1));
            desc += tipoDePersonaMay + "\n";
        }

        return desc;
    }

    public final String arreglarNombre(String nombreSinArreglar) {

        StringBuffer fuente = new StringBuffer();

        String[] strArr = nombreSinArreglar.toLowerCase().split(" ");
        for (String str : strArr) {
            char[] stringArray = str.trim().toCharArray();
            stringArray[0] = Character.toUpperCase(stringArray[0]);
            str = new String(stringArray);
            fuente.append(str).append(" ");
        }
        return fuente.toString().trim();
    }

    @Override
    public abstract String tipoDePersona();

    @Override
    public int compareTo(Persona p) {
        byte nivelDeAccesoComparado = p.getNivelDeAcceso();
        if (this.nivelDeAcceso > nivelDeAccesoComparado) {
            return 1;
        } else if (this.nivelDeAcceso == nivelDeAccesoComparado) {
            return 0;
        } else {
            return -1;
        }
    }

    @Override
    public String toString() {
        return "Nombre: " + this.nombre + "\nCédula: " + this.cedula;
    }
}
